﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Threading;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace TienTeTuong
{
    public partial class OrderInformation : System.Web.UI.Page
    {
        public OrderDTO CurOrder = new OrderDTO();
        protected void Page_Load(object sender, EventArgs e)
        {
            CurOrder = (OrderDTO)Session["Order"] ?? new OrderDTO();
        }

        protected void btnSave_Click(object sender, EventArgs e)
        {
            if (updateOrder())
            {
                Response.Redirect("Categories.aspx");
            }
        }

        protected void btnCheckOut_Click(object sender, EventArgs e)
        {
            try
            {
                updateOrder();
                Session["Order"] = CurOrder;
                CurOrder.ReceiverName = ReceiverName.Text;
                CurOrder.Phone = PhoneNumber.Text;
                CurOrder.Email = Email.Text;
                CurOrder.Address = Address.Text;
                CurOrder.Note = Note.Value;
                CurOrder.Status = "Đang chờ duyệt";
                Session["Order"] = CurOrder;
                buildEmail(CurOrder);
                var order = new Order();
                order.saveOrder(CurOrder, "");
                CurOrder = new OrderDTO();
                Session["Order"] = CurOrder;
                Note.Value = "success";
            }
            catch (Exception ex)
            {
                Logger.WriteLog(LogLevel.ERROR, ex + "\n" + ex.StackTrace);
            }
        }

        private void buildEmail(OrderDTO order)
        {
            // Email
            // Message
            string body = string.Empty;
            double totalPrice = 0;
            body = string.Format("<center><h2><strong>Xác nhận đơn hàng </strong></h2></center></br>"
                    + "Kính chào Quý khách <span style=\"font-weight:bold\">{0}</span> ,"
                    + "Tien Te Tuong vừa nhận được đơn hàng số <span style=\"font-weight:bold\">{1}</span> của Quý khách."
                    + " Chúng tôi sẽ thực hiện việc xác nhận đơn hàng và chuyển sản phẩm tới Quý khách dự kiến trong 24h. "
                    + "Để thuận tiện trong quá trình giao dịch, bằng email này TienTeTuong xin xác nhận đơn hàng và TienTeTuong sẽ chỉ"
                    + " thực hiện cuộc gọi cho Quý khách khi có thắc mắc về đơn hàng nêu trên."
                    + "Và sau đây là thông tin chi tiết về đơn hàng: <br/>"
                    + "<table cellspacing=\"0\" border=\"1px\">"
                    + "<thead>"
                    + "<tr><th>"
                    + "Gói sản phẩm"
                        + "</th><th>"
                        + "Số lượng"
                        + "</th><th>"
                        + "Đơn giá VNĐ"
                        + "</th><th>"
                        + "Thành tiền"
                        + "</th></tr></thead><tbody>",order.ReceiverName, order.ID );
            foreach (var item in CurOrder.Items)
            {
                body += "<tr><td><span class=\"CategoryName\">"
                           + item.NameToDisplay + ":</span>";
                foreach (var product in item.Products)
                {
                    body += product.ProName + "(" + product.Quantity.ToString(CultureInfo.InvariantCulture) + product.unit + "),";
                }
                body += "</td><td style=\"text-align: center; width: 60px\">"
                     + item.CategoryQuantity
                     + "</td><td style=\"text-align: right; width: 60px\">"
                     + "<span>" + Common.DisplayAsMoney(item.Price.ToString(CultureInfo.InvariantCulture)) + "</span>"
                     + "</td><td style=\"text-align: right;width: 100px\">"
                     + "<span>" + Common.DisplayAsMoney((item.Price * item.CategoryQuantity).ToString(CultureInfo.InvariantCulture)) + "</span>"
                     + "</tr>";
                totalPrice += (item.Price*item.CategoryQuantity);
            }
            body += "<tr style=\"background-color: #4b2e27; color: white; font-weight: bold;\">"
                    + "<td>Tổng cộng:</td>"
                    + "<td></td><td></td>"
                    + "<td style=\"text-align: right\"><span>"+Common.DisplayAsMoney(totalPrice.ToString(CultureInfo.InvariantCulture))+" VNĐ</span></td>"
                    + "</tr></tbody></table>";

            body += "<br/><br/>Xác nhận đơn hàng từ Website TienTeTuong.com";
            body += "<br/>Dia chi lien lac: Cong ty tien te tuong 123 Dien Bien Phu";
            body += "<br/>Dien thoai: 090909090909";
            body += "<br/>Email: contact@tientetuong.com";


            const string subject = "TienTeTuong Xác nhận đơn hàng quý khách";

            //string fromEmail = getAppSetting(typeof(string), "FromEmail").ToString();
            //var fromAddress = new MailAddress(fromEmail, "TienTeTuong");
            //var toAddress = new MailAddress(CurOrder.Email, CurOrder.ReceiverName);
            //var message = new MailMessage(fromAddress, toAddress);
            //message.Subject = subject;
            //message.Body = body;
            //ThreadPool.QueueUserWorkItem(sendEmailAction, message);

            //++ PhuongHD: change function send mail
            try
            {
                var th = new Thread(() => Common.SendEmail(CurOrder.Email, subject, body, true));
                th.Start();
            }
            catch (Exception ex)
            {

                Logger.WriteLog(LogLevel.ERROR, ex + "\n" + ex.StackTrace);
            }
            
            
            
        }

        private void sendEmailAction(Object mm)
        {
            var smtp = new SmtpClient();
            smtp.SendAsync((MailMessage)mm, null);
        }

        private bool updateOrder()
        {
            List<String> cateID = QuantityUpdateID.Value.Split('|').ToList();
            List<String> cateNum = QuantityUpdateNum.Value.Split('|').ToList();
            string removedItem = arrRemovedItem.Value;
            for (var i = 0; i < CurOrder.Items.Count; i++)
            {
                if (cateID.IndexOf(CurOrder.Items[i].CategoryDetailID) > -1)
                {
                    int quantity = 0;
                    int.TryParse(cateNum[cateID.IndexOf(CurOrder.Items[i].CategoryDetailID)], out quantity);
                    if (quantity > 0)
                    {
                        CurOrder.Items[i].CategoryQuantity = quantity;
                    }
                    else
                    {
                        return false;
                    }

                }
                if (removedItem.IndexOf(CurOrder.Items[i].CategoryDetailID) > -1)
                {
                    CurOrder.Items.RemoveAt(i);
                    i--;
                }
            }
            Session["Order"] = CurOrder;
            return true;
        }

        private static object getAppSetting(Type expectedType, string key)
        {
            string value = ConfigurationManager.AppSettings.Get(key);

            try
            {
                if (expectedType.Equals(typeof(int)))
                {
                    return int.Parse(value);
                }

                if (expectedType.Equals(typeof(string)))
                {
                    return value;
                }

                throw new Exception("Type not supported.");
            }
            catch (Exception ex)
            {
                Logger.WriteLog(LogLevel.ERROR, ex + "\n" + ex.StackTrace);
                return null;
            }
        }
    }
}